package class03;

/**
 * 数组实现循环队列
 *
 */
public class Code04_RingArray {

	public static class MyQueue {
		private int[] arr;
		private int pushi;// end
		private int polli;// begin
		private int size;// 队列中有多少个数
		private final int limit;// 队列最大容量

		 
		public MyQueue(int limit) {
			arr = new int[limit];
			pushi = 0;
			polli = 0;
			size = 0;
			this.limit = limit;
		}

		/**
		 *  入队
		 *  限制条件：队列满，不能入队
		 *  队列数量+1
		 *  数组尾部 赋值
		 *  队列末尾位置+1，如果越界了，就等于0（nextIndex函数）
		 * @param value
		 */
		public void push(int value) {
			if (size == limit) {
				throw new RuntimeException("队列满了，不能再加了");
			}
			size++;
			arr[pushi] = value;
			pushi = nextIndex(pushi);
		}

		/**
		 *  出队
		 *   限制条件：队列空，不能出队
		 *    队列数量-1
		 *     数组头部值
		 *     队列头部位置+1，如果越界了，就等于0（nextIndex函数）
		 * @return
		 */
		public int pop() {
			if (size == 0) {
				throw new RuntimeException("队列空了，不能再拿了");
			}
			size--;
			int ans = arr[polli];
			polli = nextIndex(polli);
			return ans;
		}

		public boolean isEmpty() {
			return size == 0;
		}

		/**
		 * 实现下标循环
		 * 如果现在的下标是i，返回下一个位置
		 * @param i
		 * @return
		 */
		private int nextIndex(int i) {
			return i < limit - 1 ? i + 1 : 0;
		}

	}

}
